﻿using System;
using System.ComponentModel;
using System.Windows.Forms;
using GSQ.BusinessEntities;
using GSQ.BusinessLogic;

namespace UIapp.Controles
{
    public partial class ctrAgregarProductos : UserControl
    {
        public ctrAgregarProductos()
        {
            InitializeComponent();
            if (this.COSTO_PRECIO == CostoPrecio.Costo)
            {
                this.lblCostoPrecio.Text = "Costo";
            }
            else
            {
                this.lblCostoPrecio.Text = "Precio";
            }
        }

        #region Variables
        public enum CostoPrecio
        {
            Costo,
            Precio
        }
        PRODUCTOS _producto;
        bool _editCostoPrecio = false;
        bool _editDescuento = false;
        bool _allowCantidadCero = false;
        CostoPrecio _costoPrecio = CostoPrecio.Costo;
        #endregion

        #region Metodos Auxiliares
        public CostoPrecio COSTO_PRECIO
        {
            get { return _costoPrecio; }
            set
            {
                if (value == CostoPrecio.Costo)
                {
                    this.lblCostoPrecio.Text = "Costo";
                }
                else
                {
                    this.lblCostoPrecio.Text = "Precio";
                }
                _costoPrecio = value;
            }
        }

        public PRODUCTOS PRODUCTO
        {
            get { return _producto; }
            set { _producto = value; }
        }

        public void BindControls()
        {
            this.txtCodigo.Text = this.PRODUCTO.CODIGO;

            if (this.PRODUCTO.DESCRIPCIONES != null)
            {
                this.lblDescripcion.Text = this.PRODUCTO.DESCRIPCIONES.DESCRIPCION;
            }

            if (this.COSTO_PRECIO == CostoPrecio.Costo)
                this.txtCostoPrecio.Text = this.PRODUCTO.COSTO.ToString("N2");
            else
                this.txtCostoPrecio.Text = this.PRODUCTO.PRECIO.ToString("N2");
        }

        private void BuscarProducto(string value)
        {
            if (value.Trim() != string.Empty)
            {
                if (this.PRODUCTO != null)
                {
                    if (this.PRODUCTO.CODIGO == value.Trim())
                        return;
                }

                this.PRODUCTO = new ProductosBL().GetByCodigo(value.Trim());
                if (this.PRODUCTO == null)
                {
                    Vistas.frmProductos frm = new Vistas.frmProductos(false);
                    frm.txtSearchValue.Text = value.Trim();
                    if (this.COSTO_PRECIO == CostoPrecio.Costo)
                        frm.HideCosto = true;
                    else
                        frm.HidePrecio = true;
                    if (frm.ShowDialog(this) == DialogResult.OK)
                    {
                        if (frm.SelectedProducto.ACTIVO)
                        {
                            this.PRODUCTO = frm.SelectedProducto;
                            this.BindControls();
                            //  this.txtCantidad.Focus();
                        }
                        {
                            Comun.ShowInMainMessage("Producto está inactivo.");
                            this.txtCodigo.Focus();
                            this.txtCodigo.SelectAll();
                            this.PRODUCTO = null;
                        }

                    }
                    else
                        this.Limpiar();
                }
                else
                {
                    if (this.PRODUCTO.ACTIVO)
                    {
                        this.BindControls();
                        //  this.txtCantidad.Focus();
                    }
                    else
                    {
                        Comun.ShowInMainMessage("Producto está inactivo.");
                        this.txtCodigo.Focus();
                        this.txtCodigo.SelectAll();
                        this.PRODUCTO = null;
                    }
                }
            }
        }

        private void Limpiar()
        {
            this.txtCodigo.SelectAll();

            this.lblDescripcion.Text = "___";


            this.txtCostoPrecio.Text = "0.00";


            this.txtCantidad.Text = "0.00";
            this.txtDescuento.Text = "0.00";
            this.lblImporte.Text = "0.00";
            this.PRODUCTO = null;
        }

        [Browsable(true), DefaultValue(false)]
        public bool EditCosto
        {
            get { return this._editCostoPrecio; }
            set
            {
                this._editCostoPrecio = value;
                this.txtCostoPrecio.Enabled = value;
            }
        }

        [Browsable(true), DefaultValue(false)]
        public bool EditDescuento
        {
            get { return this._editDescuento; }
            set
            {
                this._editDescuento = value;
                this.txtDescuento.Enabled = value;
            }
        }

        [Browsable(true), DefaultValue(false)]
        public bool AllowCantidadCero
        {
            get { return this._allowCantidadCero; }
            set
            {
                this._allowCantidadCero = value;
            }
        }
        #endregion

        #region Tratamiento de eventos
        private void txtCodigo_Validating(object sender, CancelEventArgs e)
        {
            if (this.txtCodigo.Text.Trim() != string.Empty)
                this.BuscarProducto(this.txtCodigo.Text.Trim());
            else
                this.Limpiar();
        }

        private void txtCodigo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                Vistas.frmProductos frm = new Vistas.frmProductos(false);
                //   frm.txtSearchValue.Text = value.Trim();
                //if (this.COSTO_PRECIO == CostoPrecio.Costo)
                //  //  frm.HideCosto = true;
                //else
                //    frm.HidePrecio = true;
                if (frm.ShowDialog(this) == DialogResult.OK)
                {
                    this.PRODUCTO = frm.SelectedProducto;
                    this.BindControls();
                    this.txtCantidad.Focus();
                }
                else
                    this.Limpiar();
            }
        }

        private void txtCosto_Validating(object sender, CancelEventArgs e)
        {
            decimal value = 0;
            if (decimal.TryParse(((Telerik.WinControls.UI.RadTextBox)sender).Text.Trim(), out value))
            {
                ((Telerik.WinControls.UI.RadTextBox)sender).Text = value.ToString("N2");
                this.lblImporte.Text = ((decimal.Parse(this.txtCantidad.Text.Trim()) *
                          decimal.Parse(this.txtCostoPrecio.Text.Trim())) - decimal.Parse(this.txtDescuento.Text.Trim())).ToString("N2");
            }
            else
            {
                ((Telerik.WinControls.UI.RadTextBox)sender).Focus();
                Comun.ShowInMainMessage("Este campo no permite letras ni puede estar vacío.");
            }
        }

        private void txtCosto_TextChanged(object sender, EventArgs e)
        {
            if (((Telerik.WinControls.UI.RadTextBox)sender).Text.Trim() == string.Empty || this._producto == null)
            {
                ((Telerik.WinControls.UI.RadTextBox)sender).Text = "0.00";
                ((Telerik.WinControls.UI.RadTextBox)sender).SelectAll();
                Comun.ShowInMainMessage("");
                return;
            }
        }

        private void txtCosto_Enter(object sender, EventArgs e)
        {
            ((Telerik.WinControls.UI.RadTextBox)sender).SelectAll();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            if (this.PRODUCTO != null)
            {
                decimal cantidad = 0;
                if (decimal.TryParse(this.txtCantidad.Text.Trim(), out cantidad))
                {
                    if (!AllowCantidadCero && cantidad <= 0)
                    {
                        Comun.ShowInMainMessage("Debe especificar una CANTIDAD mayor que CERO.");
                        return;
                    }

                    if (this.EditCosto && decimal.Parse(this.txtCostoPrecio.Text.Trim()) <= 0)
                    {
                        if(COSTO_PRECIO== CostoPrecio.Costo)
                        Comun.ShowInMainMessage("Debe especificar un COSTO mayor que CERO.");
                        else
                            Comun.ShowInMainMessage("Debe especificar un PRECIO mayor que CERO.");
                        return;
                    }

                    TransferEntity tranf = new TransferEntity();
                    tranf.PRODUCTOS = this._producto;
                    tranf.COSTO = decimal.Parse(this.txtCostoPrecio.Text.Trim());
                    tranf.CANTIDAD = cantidad;
                    tranf.DESCUENTO = decimal.Parse(this.txtDescuento.Text.Trim());
                    if (COSTO_PRECIO == CostoPrecio.Precio)
                    {
                        //if (tranf.PRODUCTOS.PRECIO <= 0)
                        //{
                        //    Comun.ShowInMainMessage("Producto no tiene precio definido.");
                        //    this.txtCodigo.Focus();
                        //    this.txtCodigo.SelectAll();
                        //    return;
                        //}
                        if (!Comun.utilidades.FACTURAR_MERCANCIA_CERO && tranf.CANTIDAD > _producto.EXISTENCIA)
                        {
                            Comun.ShowInMainMessage("Producto no tiene existencia suficiente para facturar.");
                            this.txtCodigo.Focus();
                            this.txtCodigo.SelectAll();
                            return;
                        }
                        decimal x_descuento = (tranf.DESCUENTO / (tranf.CANTIDAD * tranf.COSTO)) * 100;
                        if (x_descuento > Comun.utilidades.X_DESC_MAX)
                        {
                            Comun.ShowInMainMessage("Descuento excede el % permitido.");
                            this.txtDescuento.Focus();
                            this.txtDescuento.SelectAll();
                            return;
                        }

                        if (tranf.COSTO < _producto.COSTO)
                        {
                            Comun.ShowInMainMessage("Precio esta por debajo del costo.");
                            this.txtCostoPrecio.Focus();
                            this.txtCostoPrecio.SelectAll();
                            return;
                        }

                    }
                    ((Interfaces.IPantalla)this.ParentForm).AgregarProducto(tranf);
                    this.Limpiar();
                    this.txtCodigo.Clear();
                    this.txtCodigo.Focus();
                }
                else
                    Comun.ShowInMainMessage("Debe seleccionar un producto");
            }
        }
        #endregion
    }

    public class TransferEntity
    {
        private decimal _cANTIDAD;
        public decimal CANTIDAD
        {
            get { return this._cANTIDAD; }
            set { this._cANTIDAD = value; }
        }

        private decimal _iMPUESTO;
        public decimal IMPUESTO
        {
            get { return this._iMPUESTO; }
            set { this._iMPUESTO = value; }
        }

        private decimal _xIMPUESTO;
        public decimal X_IMPUESTO
        {
            get { return this._xIMPUESTO; }
            set { this._xIMPUESTO = value; }
        }

        private decimal _dESCUENTO;
        public decimal DESCUENTO
        {
            get { return this._dESCUENTO; }
            set { this._dESCUENTO = value; }
        }

        private decimal _xDESCUENTO;
        public decimal X_DESCUENTO
        {
            get { return this._xDESCUENTO; }
            set { this._xDESCUENTO = value; }
        }

        private decimal _cOSTO;
        public decimal COSTO
        {
            get { return this._cOSTO; }
            set { this._cOSTO = value; }
        }

        private PRODUCTOS _pRODUCTOS;
        public PRODUCTOS PRODUCTOS
        {
            get { return this._pRODUCTOS; }
            set { this._pRODUCTOS = value; }
        }
    }
}
